//Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 
//
// 最开始，他在周一的时候存入 1 块钱。从周二到周日，他每天都比前一天多存入 1 块钱。在接下来每一个周一，他都会比 前一个周一 多存入 1 块钱。 
//
// 给你 n ，请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。 
//
// 
//
// 示例 1： 
//
// 输入：n = 4
//输出：10
//解释：第 4 天后，总额为 1 + 2 + 3 + 4 = 10 。
// 
//
// 示例 2： 
//
// 输入：n = 10
//输出：37
//解释：第 10 天后，总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37 。注意到第二个星期一，
//Hercy 存入 2 块钱。
// 
//
// 示例 3： 
//
// 输入：n = 20
//输出：96
//解释：第 20 天后，总额为 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 
//+ 4 + 5 + 6 + 7 + 8) = 96 。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= n <= 1000 
// 
//
// Related Topics 数学 👍 100 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-10-25 22:23:39
 * @description 1716.计算力扣银行的钱
 */
public class CalculateMoneyInLeetcodeBank{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 CalculateMoneyInLeetcodeBank fun=new CalculateMoneyInLeetcodeBank();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 // 模拟
	public int totalMoney1(int n) {
		int week = 1, day = 1;
		int res = 0;
		for (int i = 0; i < n; ++i) {
			res += week + day - 1;
			++day;
			if (day == 8) {
				day = 1;
				++week;
			}
		}
		return res;
	}
	// 数学等差数列
	public int totalMoney2(int n) {
		// 所有完整的周存的钱
		int weekNumber = n / 7;
		int firstWeekMoney = (1 + 7) * 7 / 2;
		int lastWeekMoney = firstWeekMoney + 7 * (weekNumber - 1);
		int weekMoney = (firstWeekMoney + lastWeekMoney) * weekNumber / 2;
		// 剩下的不能构成一个完整的周的天数里存的钱
		int dayNumber = n % 7;
		int firstDayMoney = 1 + weekNumber;
		int lastDayMoney = firstDayMoney + dayNumber - 1;
		int dayMoney = (firstDayMoney + lastDayMoney) * dayNumber / 2;
		return weekMoney + dayMoney;
	}

	int totalMoney3(int n) {
		// 有 k 周，
		// 那么: 周一之和就是  1+2+..+k
		//      周二之和就是 2+3+...+k+k+1，即 1+2+..+k + k*1
		//      周三之和就是 3+4+...+k+k+1+k+2，即 1+2+..+k + k*2
		// 周一到周日之和就是 7*(1+2+..+k) + (1+2+3+4+5+6)*k = 7*k*(k+1)/2+21*k
		// ------------------------------------------
		// 假如k周余下s天。那么需要再加上 k*s+s*(s+1)/2
		int k = n / 7, s = n % 7;
		return 7*k*(k+1)/2+21*k + k*s+s*(s+1)/2;
	}
	public int totalMoney(int n) {
		return (n/7*(n/7*7+49)+n%7*(n%7+1))/2+n%7*(n/7);
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
